home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1992 …SCII & the Runetime Code / ADC Developer CD (1992-07) (''Butch ASCII And The Runtime Code'')_iso / Dev.CD 199207.iso / Developer Essentials / DTS Sample Code / DTS Japan-Sample Code / AppleEvent•MacApp2.0•QuickDraw / UDraw.cp < prev    next >
Encoding:
Text File  |  1992-02-05  |  66.1 KB  |  1,976 lines  |  [TEXT/MPS ]

  1. //---------------------------------------------------------------------
  2. //     Copyright © 1991 Apple Computer, Japan Inc. All rights reserved.
  3. //
  4. //        '91 Dec.11  Programed by Taro Tanaka
  5. //
  6. //        Developer Technical Supprt, Service and Support
  7. //        
  8. //---------------------------------------------------------------------
  9.  
  10. #include "UDraw.h"
  11.  
  12. const OSType kFileType        =    'colr';
  13. const OSType kSignature        =    'riho';    // Creator name
  14. const short    kWindRsrcID        =    1000;
  15.  
  16. const short    kIconWidth        =    32;
  17. const short    kIconID            =    1000;
  18.  
  19. const short eventNotHandled    = -1708;
  20.  
  21. // ---- Apple Event Registry ------------------------------------------
  22. const long kAECoreSuite                = 'core';
  23. const long kAEClose                    = 'clos';
  24. const long kAEAbout                    = 'abou';
  25. const long kAEQDGraphicsSuite        = 'qdrw';
  26. const long kAEEditGraphic            = 'edit';
  27.  
  28. const long cDocument                    = 'docu';
  29. const long cGraphicLine                = 'glin';
  30. const long cGraphicObject            = 'cgob';
  31. const long cGraphicShape            = 'cgsh';
  32. const long cOval                        = 'covl';
  33. const long cRectangle                = 'crec';
  34. const long cRoundedRectangle        = 'crrc';
  35.  
  36. const long keyAEBounds                = 'kbnd';
  37. const long keyAECurveHeight        = 'kchd';
  38. const long keyAECurveWidth            = 'kcwd';
  39. const long keyAEDefinitionRect    = 'kdef';
  40. const long keyAEEndPoint            = 'kedp';
  41. const long keyAEFillColor            = 'kfcl';
  42. const long keyAEFillPattern        = 'kfpt';
  43. const long keyAEGraphicObjects    = 'kgrs';
  44. const long keyAELineArrow            = 'lnar';
  45. const long keyAEPenColor            = 'kpcl';
  46. const long keyAEPenPattern            = 'kpat';
  47. const long keyAEPenWidth            = 'kpwd';
  48. const long keyAEStartPoint            = 'kstr';
  49. const long keyAETransferMode        = 'ktrn';
  50.  
  51. const long keyAEShape                = 'gshp';
  52.  
  53. const long typeArc                    = 'tarc';
  54. const long typeEnumeration            = 'enum';
  55. const long typeGraphicLine            = 'tgln';
  56. const long typeOval                    = 'tovl';
  57. const long typePICT                    = 'PICT';
  58. const long typePixelMap                = 'tpix';
  59. const long typeQDPoint                = 'QDpt';
  60. const long typeQDRectangle            = 'qdrt';
  61. const long typeRGBColor                = 'RGB ';
  62. const long typeRectangle            = 'rcte';
  63. const long typeRoundedRectangle    = 'trdr';
  64.  
  65. const long typePattern                = 'patt';
  66. const CmdNumber    cSketcher            =    1000;
  67.  
  68. const CmdNumber    cBlack                =    2001;
  69. const CmdNumber    cRed                    =    2002;
  70. const CmdNumber    cGreen                =    2003;
  71. const CmdNumber    cBlue                    =    2004;
  72.  
  73. const CmdNumber    cLineNormal            =    2100;
  74.  
  75. const CmdNumber    cDeleteFirst        =    3001;
  76. const CmdNumber    cDeleteFirstMsg    =    3101;
  77.  
  78. const CmdNumber    cSetSelf                =    4001;
  79. const CmdNumber    cSetTargetAddress    =    4002;
  80. const    CmdNumber    cLaunch                =    4003;
  81.  
  82. const    CmdNumber    cSound                =    4501;
  83.  
  84. const CmdNumber    cAEOpen                =    5001;
  85. const    CmdNumber    cAEPrint                =    5002;
  86. const    CmdNumber    cAENew                =    5003;
  87. const CmdNumber    cAEClose                =    5004;
  88. const CmdNumber    cAEAboutApp            =    5005;
  89.  
  90.     
  91. RGBColor    gColorArray[cBlue - cBlack + 1];
  92. Rect gColorRect[cBlue - cBlack + 1];
  93. Rect gLineRect[4];
  94. Point    gOvalSize;
  95. TDocument *gTargetDocument;
  96. long    gOldTick;
  97. Boolean    gSound;
  98.  
  99. extern "C" char* memcpy(void*, void*, int);
  100. #define pstrcpy(p,q) memcpy(p, q, q[0]+1)                    // added for translation: Pascal strcpy
  101.  
  102.     AEAddressDesc    gSELF;                    // Target address desc -> SELF
  103.     AEAddressDesc    gCurrentTarget;        // current address desc
  104.     Boolean            gIsCurrentTargetSelf;
  105.     Boolean            gIsCurrentTargetLocal;    // current target is local or remote?
  106.  
  107. extern TDrawApplication *gDrawApplication;
  108.  
  109. // ============================================================================
  110. //        Global routines
  111. // ============================================================================
  112. #pragma segment AAEHandler
  113. pascal void setGrafportToFrontWindow()
  114. {
  115.     TWindow *aWindow = gDrawApplication->GetFrontWindow();
  116.     TView *aView = aWindow->FindSubView('Draw');
  117.     FailNIL(aView);
  118.     if (aView->Focus());
  119. }
  120.  
  121. // ---------------------------------------------------------------------------
  122. #pragma segment AAEHandler
  123. pascal void setTargetDocument(short absolutePosition)
  124. {
  125.     ArrayIndex maxIndex = gDocList->GetSize();
  126.     if (absolutePosition <= maxIndex)
  127.         gTargetDocument = (TDocument*)gDocList->At(absolutePosition);
  128.     else
  129.         gTargetDocument = (TDocument*)gDocList->Last();
  130. }
  131.  
  132. // ---------------------------------------------------------------------------
  133. #pragma segment AAEHandler
  134. pascal void requestTargetDocument()
  135. {
  136. }
  137.  
  138. // ---------------------------------------------------------------------------
  139. #pragma segment AAEHandler
  140. pascal void GetStr255FromTextHandle(Handle hText, StringPtr pStr)
  141. {
  142.     *pStr = (unsigned char)GetHandleSize(hText);
  143.     memcpy(pStr+1, *hText, (int)GetHandleSize(hText));
  144. }
  145.  
  146. // ---------------------------------------------------------------------------
  147. #pragma segemnt AAEHandler
  148. pascal short CompStr255(ConstStr255Param aStr, ConstStr255Param bStr)
  149. {
  150.     short    rts = 0;
  151.     
  152.     unsigned char aMin = aStr[0];
  153.     if (aMin>bStr[0])
  154.         aMin = bStr[0];
  155.     
  156.     for(unsigned char i=1;i<aStr[0]+1;i++) {
  157.         if (aStr[i] != bStr[i])
  158.             rts = -1;
  159.     }
  160.     return rts;
  161. }
  162.  
  163. // ============================================================================
  164. //        Apple Event Object Accessor
  165. // ============================================================================
  166. #pragma segemnt AAEHandler
  167. pascal OSErr myDocumentAccessor(DescType desiredClass, AEDesc* /* containerToken */, DescType /* containerClass */, DescType keyForm, AEDesc *keyData, AEDesc *theToken, long /* theRefcon */)
  168. {
  169.     OSErr        returnedErr;
  170.  
  171.     returnedErr = eventNotHandled;
  172.     if (desiredClass == cDocument) {
  173.         if (keyForm == formName) {
  174.             FailOSErr(AEDuplicateDesc(keyData, theToken));
  175.             returnedErr = noErr;
  176.         }
  177.     }
  178.     return returnedErr;
  179. }
  180.  
  181. // ============================================================================
  182. //        Apple Event Handler
  183. // ============================================================================
  184. #pragma segemnt AAEHandler
  185. pascal OSErr myHandleOAPP(AppleEvent /* *theAppleEvent */, AppleEvent /* *reply */, long /* handlerRefcon */)
  186. {
  187.     gDrawApplication->OpenNew(cNew);
  188.     return    noErr;
  189. }
  190.  
  191. //--------------------------------------------------------------------------------------------------
  192. #pragma segment AAEHandler
  193. pascal OSErr myHandleODOC(AppleEvent *theAppleEvent, AppleEvent /* *reply */, long /* handlerRefcon */)
  194. {
  195.     FSSpec            openedFSS;
  196.     AppFile            openedAppFile;
  197.     Size                actualSize;
  198.     AEDescList        docList;
  199.     long                itemsInList;
  200.     long                index;
  201.     AEKeyword        returnedKeywd;
  202.     DescType            returnedType;
  203.     short                wdRefNum;
  204.     
  205.     gDrawApplication->fLaunchWithNewDocument = false;
  206.     
  207.     FailOSErr(AEGetParamDesc(theAppleEvent, keyDirectObject, typeAEList, &docList));
  208.     FailOSErr(AECountItems(&docList, &itemsInList));
  209.     for(index=1;index<=itemsInList;index++) {
  210.         FailOSErr(AEGetNthPtr(&docList, index, typeFSS, &returnedKeywd, &returnedType, (Ptr)&openedFSS, sizeof(openedFSS), &actualSize));
  211.         FailOSErr(OpenWD(openedFSS.vRefNum, openedFSS.parID, 0, &wdRefNum));
  212.         openedAppFile.vRefNum    = wdRefNum;
  213.         openedAppFile.fType        = kFileType;
  214.         pstrcpy(openedAppFile.fName, openedFSS.name);
  215.         gDrawApplication->OpenOld(cOpen, &openedAppFile);    
  216.      }
  217.     FailOSErr(AEDisposeDesc(&docList));
  218.     return    noErr;
  219. }
  220.  
  221. //--------------------------------------------------------------------------------------------------
  222. #pragma segment AAEHandler
  223. pascal OSErr myHandlePDOC(AppleEvent *theAppleEvent, AppleEvent /* *reply */, long /* handlerRefcon */)
  224. {
  225.     FSSpec            openedFSS;
  226.     AppFile            openedAppFile;
  227.     Size                actualSize;
  228.     AEDescList        docList;
  229.     long                itemsInList;
  230.     long                index;
  231.     AEKeyword        returnedKeywd;
  232.     DescType            returnedType;
  233.     short                wdRefNum;
  234.     
  235.     FailOSErr(AEGetParamDesc(theAppleEvent, keyDirectObject, typeAEList, &docList));
  236.     FailOSErr(AECountItems(&docList, &itemsInList));
  237.     for(index=1;index<=itemsInList;index++) {
  238.         FailOSErr(AEGetNthPtr(&docList, index, typeFSS, &returnedKeywd, &returnedType, (Ptr)&openedFSS, sizeof(openedFSS), &actualSize));
  239.         FailOSErr(OpenWD(openedFSS.vRefNum, openedFSS.parID, 0, &wdRefNum));
  240.         openedAppFile.vRefNum    = wdRefNum;
  241.         openedAppFile.fType        = kFileType;
  242.         pstrcpy(openedAppFile.fName, openedFSS.name);
  243.         gDrawApplication->PrintDocument(&openedAppFile);    
  244.      }
  245.     FailOSErr(AEDisposeDesc(&docList));
  246.     return    noErr;
  247. }
  248.  
  249. //--------------------------------------------------------------------------------------------------
  250. #pragma segment AAEHandler
  251. pascal OSErr myHandleQUIT(AppleEvent /* *theAppleEvent */, AppleEvent /* *reply */, long /* handlerRefcon */)
  252. {
  253.     TQuitCommand* aQuitCommand = new TQuitCommand;
  254.     aQuitCommand->IQuitCommand(cQuit);
  255.     gDrawApplication->PostCommand((TCommand*)aQuitCommand);
  256.     gAppDone = true;
  257.     return    noErr;
  258. }
  259.  
  260. //--------------------------------------------------------------------------------------------------
  261. #pragma segment AAEHandler
  262. pascal OSErr myHandlerApplDied(AppleEvent *theAppleEvent, AppleEvent /* *reply */, long /* handlerRefcon */)
  263. {
  264.     AEDesc        copyofTarget;
  265.     ProcessSerialNumber    targetPSN;
  266.     ProcessSerialNumber    diedPSN;
  267.     DescType        returnedType;
  268.     Size            returnedSize;
  269.     Boolean        result;
  270.     long            diedErr;
  271.     TNoChangesCommand    *aNoChangesCommand;
  272.     
  273.     if (gIsCurrentTargetSelf)
  274.         return noErr;
  275.     else  {
  276.     if (gIsCurrentTargetLocal) {
  277.             FailOSErr(AEDuplicateDesc(&gCurrentTarget, ©ofTarget));
  278.             targetPSN = *((ProcessSerialNumber*)*copyofTarget.dataHandle);
  279.             FailOSErr(AEGetParamPtr(theAppleEvent, keyProcessSerialNumber, typeProcessSerialNumber,    &returnedType, (Ptr)&diedPSN, sizeof(ProcessSerialNumber),    &returnedSize)); 
  280.             FailOSErr(AEGetParamPtr(theAppleEvent, keyErrorNumber, typeLongInteger,                &returnedType, (Ptr)&diedErr, sizeof(long),                        &returnedSize)); 
  281.             FailOSErr(SameProcess(&targetPSN, &diedPSN, &result));
  282.             if (result) {
  283.                 short itemHit = MacAppAlert(1000, nil);
  284.                 aNoChangesCommand = (TNoChangesCommand*)new TSetSelfCmd;
  285.                 FailNIL(aNoChangesCommand);
  286.                 aNoChangesCommand->INoChangesCommand(cSetSelf, (TDocument*)nil, (TView*)nil, (TScroller*)nil);
  287.                 gDrawApplication->PostCommand((TCommand*)aNoChangesCommand);
  288.             }
  289.         }
  290.     }
  291. }
  292.  
  293. //--------------------------------------------------------------------------------------------------
  294. #pragma segment AAEHandler
  295. pascal OSErr myHandleCloseWindow(AppleEvent *theAppleEvent, AppleEvent /* *reply */, long /* handlerRefcon */)
  296. {
  297.     AEDesc    objDesc;
  298.     AEDesc    aToken;
  299.     TCloseWindowCommand    *aCloseWindowCommand;
  300.     Str255    aDocName;
  301.     Str255    aDocTitle;
  302.     Str255    aCStringDocTitle;    
  303.  
  304.     
  305.     FailOSErr(AEGetParamDesc(theAppleEvent, keyDirectObject, typeObjectSpecifier, &objDesc));
  306.     if (AEResolve(&objDesc, kAEIDoMinimum, &aToken) == noErr) {
  307.         GetStr255FromTextHandle(aToken.dataHandle, (StringPtr)&aDocName);
  308.         for(short i=1;i<gDocList->GetSize()+1;i++) {
  309.             TDocument *aDocument = (TDocument*)gDocList->At(i);
  310.             GetStr255FromTextHandle((Handle)aDocument->fTitle, (StringPtr)&aCStringDocTitle);
  311.             memcpy(&aDocTitle, &aCStringDocTitle + 1, aCStringDocTitle[0]);
  312.             if (CompStr255((ConstStr255Param)aDocName,
  313.                 (ConstStr255Param)aDocTitle) == 0) {
  314.                 aCloseWindowCommand = new TCloseWindowCommand;
  315.                 FailNIL(aCloseWindowCommand);
  316.                 aCloseWindowCommand->ICloseWindowCommand(cClose, (TWindow*)((TDocument*)gDocList->At(i))->fWindowList->Last());
  317.                 gDrawApplication->PostCommand((TCommand*)aCloseWindowCommand);
  318.             }
  319.         }
  320.     }
  321.     else
  322.         SysBeep(1);
  323.     return noErr;
  324. }
  325.  
  326. //--------------------------------------------------------------------------------------------------
  327. #pragma segment ASelCommand
  328. pascal Boolean myAbout(DialogPtr theDialog, EventRecord* /* theEvent */, short* /* itemHit */)
  329. {
  330.     Rect r;
  331.  
  332.     if ((TickCount() - gOldTick) > 3) {
  333.         gOldTick = TickCount();
  334.         SetPort((GrafPtr)theDialog);
  335.         SetOrigin(0,0);
  336.         long x = ((Random() + 32768) * 16 / 65536) * 20;
  337.         long y = ((Random() + 32768) * 16 / 65536) * 20;
  338.     
  339.         r.top = (short)y;
  340.         r.left = (short)x;
  341.         r.right = r.left + 20;
  342.         r.bottom = r.top + 20;
  343.  
  344.         InvertRect(&r);
  345.     }
  346.     return false;
  347. }
  348.  
  349.  
  350.  
  351. //--------------------------------------------------------------------------------------------------
  352. #pragma segment AAEHandler
  353. pascal OSErr myHandleAbout(AppleEvent /* *theAppleEvent */, AppleEvent /* *reply */, long /* handlerRefcon */)
  354. {
  355. //    TAboutAppCommand    *anAboutAppCommand;
  356.     
  357. //    anAboutAppCommand = new TAboutAppCommand;
  358. //    FailNIL(anAboutAppCommand);
  359. //    anAboutAppCommand->IAboutAppCommand(cAboutApp);
  360. //    gDrawApplication->PostCommand((TCommand*)anAboutAppCommand);
  361.     
  362.     gOldTick = TickCount();
  363.     
  364.     short itemHit = MacAppAlert(1001, (Ptr)&myAbout);
  365.     return    noErr;
  366. }
  367. //--------------------------------------------------------------------------------------------------
  368. #pragma segment AAEHandler
  369. pascal OSErr myHandlerWildCard(AppleEvent /* *theAppleEvent */, AppleEvent /* *reply */, long /* handlerRefcon */)
  370. {
  371.     return    noErr;
  372. }
  373.  
  374. //--------------------------------------------------------------------------------------------------
  375. #pragma segment AAEHandler
  376. pascal OSErr myHandleQuickDraw(AppleEvent *theAppleEvent, AppleEvent* /* reply */, long /* handlerRefcon */)
  377. {
  378.     DescType        returnedType;
  379.     Size            returnedSize;
  380.     DescType        pShape;
  381.     OSErr            AEErr;
  382.     Rect            pBounds;
  383.     Rect            pDefRect;
  384.     RGBColor        pFillColor;
  385.     Pattern        pFillPattern;
  386.     RGBColor        pPenColor;
  387.     Pattern        pPenPattern;
  388.     short            pPenWidth;
  389.     short            pTransferMode;
  390.     Point            pEndPoint;
  391.     Point            pStartPoint;
  392.     short            pLineArrow;
  393.     Point            pCurve;
  394.     PicHandle    pPicHandle;
  395.     Handle        pSndHandle;
  396.     short            pSndID;
  397.  
  398.     TDraw*        aDraw;
  399.  
  400.     //--------------------------- set the environment of QuickDraw
  401.     PenNormal();
  402.     
  403.     AEErr = AEGetParamPtr(theAppleEvent, keyAEShape,                typeType,            &returnedType, (Ptr)&pShape,            sizeof(DescType), &returnedSize);
  404.  
  405.     //----- cGraphicObject;
  406.     AEErr = AEGetParamPtr(theAppleEvent,    keyAEBounds,            typeQDRectangle,    &returnedType, (Ptr)&pBounds,            sizeof(Rect),        &returnedSize);
  407.     AEErr = AEGetParamPtr(theAppleEvent,    keyAETransferMode,    typeEnumeration,    &returnedType,    (Ptr)&pTransferMode,    sizeof(short),        &returnedSize);
  408.  
  409.     if (pShape == typeGraphicLine) {
  410.         AEErr = AEGetParamPtr(theAppleEvent,    keyAEEndPoint,        typeQDPoint,        &returnedType,    (Ptr)&pEndPoint,        sizeof(Point),        &returnedSize);
  411.         AEErr = AEGetParamPtr(theAppleEvent,    keyAELineArrow,    typeEnumeration,    &returnedType,    (Ptr)&pLineArrow,        sizeof(Point),        &returnedSize);
  412.         AEErr = AEGetParamPtr(theAppleEvent,     keyAEPenColor,        typeRGBColor,        &returnedType,    (Ptr)&pPenColor,        sizeof(RGBColor),    &returnedSize);
  413.         AEErr = AEGetParamPtr(theAppleEvent,    keyAEPenPattern,    typePattern,        &returnedType,    (Ptr)&pPenPattern,    sizeof(Pattern),    &returnedSize);
  414.         AEErr = AEGetParamPtr(theAppleEvent,     keyAEPenWidth,        typeShortInteger,    &returnedType,    (Ptr)&pPenWidth,        sizeof(short),        &returnedSize);
  415.         AEErr = AEGetParamPtr(theAppleEvent,    keyAEStartPoint,    typeQDPoint,        &returnedType,    (Ptr)&pStartPoint,    sizeof(Point),        &returnedSize);
  416.         TDrawingLine* aDrawLine = new TDrawingLine;
  417.         RGBForeColor(&pPenColor);
  418.         PenMode(pTransferMode);
  419.         PenSize(pPenWidth, pPenWidth);
  420.         aDrawLine->IStartEnd(pStartPoint, pEndPoint);
  421.         aDraw = (TDraw*)aDrawLine;
  422.         Pt2Rect(pStartPoint, pEndPoint, &pDefRect);
  423.         aDraw->IDraw(&pDefRect, &pPenColor, (ConstPatternParam*)&pFillPattern, pPenWidth);
  424.         pSndID = 132;
  425.     }
  426.     else {
  427.     //----- cGraphicShape;
  428.         AEErr = AEGetParamPtr(theAppleEvent, keyAEDefinitionRect,    typeQDRectangle,    &returnedType, (Ptr)&pDefRect,        sizeof(Rect),        &returnedSize);
  429.         AEErr = AEGetParamPtr(theAppleEvent, keyAEFillColor,            typeRGBColor,        &returnedType,    (Ptr)&pFillColor,        sizeof(RGBColor),    &returnedSize);
  430.         AEErr = AEGetParamPtr(theAppleEvent, keyAEFillPattern,        typePattern,        &returnedType,    (Ptr)&pFillPattern,    sizeof(Pattern),    &returnedSize);
  431.         AEErr = AEGetParamPtr(theAppleEvent, keyAEPenColor,            typeRGBColor,        &returnedType,    (Ptr)&pPenColor,        sizeof(RGBColor),    &returnedSize);
  432.         AEErr = AEGetParamPtr(theAppleEvent, keyAEPenPattern,            typePattern,        &returnedType,    (Ptr)&pPenPattern,    sizeof(Pattern),    &returnedSize);
  433.         AEErr = AEGetParamPtr(theAppleEvent, keyAEPenWidth,            typeShortInteger,    &returnedType,    (Ptr)&pPenWidth,        sizeof(short),        &returnedSize);
  434.  
  435.         RGBForeColor(&pPenColor);
  436.         PenMode(pTransferMode);
  437.         PenSize(pPenWidth, pPenWidth);
  438.         PenPat((ConstPatternParam)pPenPattern);
  439.         switch (pShape) {
  440.             case typeRectangle:
  441.                 aDraw = (TDraw*)new TDrawingRect;
  442.                 pSndID = 129;
  443.                 break;
  444.             case typeOval:
  445.                 aDraw = (TDraw*)new TDrawingOval;
  446.                 pSndID = 130;
  447.                 break;
  448.             case typeRoundedRectangle:
  449.                 AEErr = AEGetParamPtr(theAppleEvent, keyAECurveHeight,    typeShortInteger,    &returnedType,    (Ptr)&pCurve.v,    sizeof(short),        &returnedSize);
  450.                 AEErr = AEGetParamPtr(theAppleEvent, keyAECurveWidth,        typeShortInteger,    &returnedType,    (Ptr)&pCurve.h,    sizeof(short),        &returnedSize);
  451.                 TDrawingRRect* aDrawRRect = new TDrawingRRect;
  452.                 aDrawRRect->ISetOval(pCurve);
  453.                 aDraw = (TDraw*)aDrawRRect;
  454.                 pSndID = 131;
  455.                 break;
  456.             case typePICT:
  457.                 AEErr = AESizeOfParam(theAppleEvent, keyAEGraphicObjects, &returnedType, &returnedSize);
  458.                 Size pPicDataSize = returnedSize;
  459.                 pPicHandle = (PicHandle)NewHandle(pPicDataSize);
  460.                 AEErr = AEGetParamPtr(theAppleEvent, keyAEGraphicObjects, typePICT, &returnedType, (Ptr)(*pPicHandle), pPicDataSize, &returnedSize);
  461.                 pDefRect = (**pPicHandle).picFrame;
  462.                 TDrawingPICT* aDrawPICT = new TDrawingPICT;
  463.                 aDrawPICT->ISetPICT(pPicHandle);
  464.                 aDraw = (TDraw*)aDrawPICT;
  465.                 pPenWidth = 0;
  466.                 pFillColor = gRGBBlack;
  467.                 pSndID = 128;
  468.             default:
  469.                 pSndID = 128;
  470.                 break;
  471.         }
  472.         aDraw->IDraw(&pDefRect, &pFillColor, (ConstPatternParam*)&pFillPattern, pPenWidth);
  473.     }
  474.     pSndHandle = GetResource('snd ', pSndID);
  475.     if (gSound == true) 
  476.         FailOSErr(SndPlay((SndChannelPtr)nil, pSndHandle, true));
  477.     TDrawDocument *aDrawDocument = (TDrawDocument*)gDocList->Last();
  478.     if (aDrawDocument != nil) {
  479.         aDrawDocument->AddDrawLast(aDraw);
  480.         InsetRect(&pDefRect, -pPenWidth, -pPenWidth);
  481.         aDrawDocument->fDrawView->InvalidRect(&pDefRect);    // force update
  482.         }
  483.     RGBForeColor(&gRGBBlack);
  484.     PenNormal();
  485.     return noErr;
  486. }
  487.  
  488.  
  489. // ============================================================================
  490. //        Draw Application
  491. // ============================================================================
  492. #pragma segment AInit
  493. pascal void TDrawApplication::IDrawApplication()
  494. {
  495.     ProcessSerialNumber        aDrawPSN;
  496.     TNoChangesCommand                        *aCommand;
  497.  
  498.     this->IApplication(kFileType);
  499.     gColorArray[cBlack - cBlack]    = gRGBBlack;
  500.     gColorArray[cRed - cBlack].red    = 0xDD6B;
  501.     gColorArray[cRed - cBlack].green    = 0x08C2;
  502.     gColorArray[cRed - cBlack] .blue    = 0x06A2;
  503.     gColorArray[cGreen - cBlack].red        = 0;
  504.     gColorArray[cGreen - cBlack].green    = 0x8000;
  505.     gColorArray[cGreen - cBlack].blue    = 0x11B0;
  506.     gColorArray[cBlue - cBlack].red        = 0;
  507.     gColorArray[cBlue - cBlack].green    = 0;
  508.     gColorArray[cBlue - cBlack].blue        = 0xD400;
  509.     for (short iconIndex = cBlack; iconIndex <= cBlue; iconIndex++) 
  510.         SetRect(&gColorRect[iconIndex - cBlack], 
  511.                         kIconWidth * (iconIndex - cBlack),             // left
  512.                         0,                                                     // top
  513.                         kIconWidth * (iconIndex - cBlack + 1),     // right
  514.                         kIconWidth);                                        // bottom
  515.     for (short lineIndex = 1; lineIndex < 5; lineIndex++)
  516.         SetRect(&gLineRect[lineIndex-1],
  517.                         0,
  518.                         (lineIndex - 1) * 16,
  519.                         32,
  520.                         lineIndex * 16);
  521.     gOvalSize.h = 16;
  522.     gOvalSize.v = 16;
  523.     if (gDeadStripSuppression) {
  524.         TDrawView* aDrawView = new TDrawView;
  525.         TPaletteView* aPaletteView = new TPaletteView;
  526.         TShapeGridView* aShapeGridView = new TShapeGridView;
  527.         TPatternView* aPatternView = new TPatternView;
  528.         TLineView* aLineView = new TLineView;
  529.     }
  530.     
  531.     gIsCurrentTargetSelf = true;
  532.     Enable(cSetSelf, true);
  533.     aCommand = (TNoChangesCommand*)new TSetSelfCmd;
  534.     FailNIL(aCommand);
  535.     aCommand->INoChangesCommand(cSetSelf, (TDocument*)nil, (TView*)nil, (TScroller*)nil);
  536.     this->PostCommand((TCommand*)aCommand);
  537.     
  538.     gSound = true;
  539.     
  540.     // install apple event accessor -------------------- Core Apple Event
  541.     FailOSErr(AEInstallObjectAccessor(cDocument, typeNull, (accessorProcPtr)&myDocumentAccessor, 0, false));
  542.     
  543.     // install apple event handler -------------------- Required Apple Event
  544.     FailOSErr(AEInstallEventHandler(kCoreEventClass,kAEOpenApplication,    (EventHandlerProcPtr)&myHandleOAPP,0,false));
  545.     FailOSErr(AEInstallEventHandler(kCoreEventClass,kAEOpenDocuments,        (EventHandlerProcPtr)&myHandleODOC,0,false));
  546.     FailOSErr(AEInstallEventHandler(kCoreEventClass,kAEPrintDocuments,    (EventHandlerProcPtr)&myHandlePDOC,0,false));
  547.     FailOSErr(AEInstallEventHandler(kCoreEventClass,kAEQuitApplication,    (EventHandlerProcPtr)&myHandleQUIT,0,false));
  548.     // install apple event handler -------------------- Core Apple Event
  549.     FailOSErr(AEInstallEventHandler(kCoreEventClass,kAEApplicationDied,    (EventHandlerProcPtr)&myHandlerApplDied,0,false));
  550.     FailOSErr(AEInstallEventHandler(kAECoreSuite, kAEClose,                    (EventHandlerProcPtr)&myHandleCloseWindow,0,false));
  551.     FailOSErr(AEInstallEventHandler(kCoreEventClass,kAEAbout,                (EventHandlerProcPtr)&myHandleAbout,0,false));
  552.     // install apple event handler -------------------- QuickDraw Apple Event
  553.     FailOSErr(AEInstallEventHandler(kAEQDGraphicsSuite, kAEEditGraphic,    (EventHandlerProcPtr)&myHandleQuickDraw, 0, false));
  554.     FailOSErr(AEInstallEventHandler(typeWildCard,    typeWildCard,            (EventHandlerProcPtr)&myHandlerWildCard,0,false));
  555.  
  556.     aDrawPSN.highLongOfPSN = 0;
  557.     aDrawPSN.lowLongOfPSN = kCurrentProcess;
  558.     FailOSErr(AECreateDesc(typeProcessSerialNumber, (Ptr)&aDrawPSN, sizeof(ProcessSerialNumber), (AEDesc*)&gSELF));
  559. }
  560.  
  561. // ------------------------------------------------------------------------
  562. #pragma segment AOpen
  563. pascal TDocument* TDrawApplication::DoMakeDocument(CmdNumber /* itsCmdNumber */)
  564. {
  565.     TDrawDocument* aDrawDocument = new TDrawDocument;
  566.     FailNIL(aDrawDocument);
  567.     aDrawDocument->IDrawDocument();
  568.     return aDrawDocument;
  569. }
  570.  
  571. //----------------------------------------------------------------------------
  572. #pragma segment ASelCommand
  573. pascal TCommand* TDrawApplication::DoMenuCommand(CmdNumber aCmdNumber)
  574. {
  575.     AppleEvent    aQuitAppleEvent;
  576.     AppleEvent    reply;
  577.     TNoChangesCommand    *aNoChangesCommand;
  578.     TAEOldDocCommand    *aOldDocCommand;
  579.     TAENewDocCommand    *aNewDocCommand;
  580.     TAECloseWindowCommand    *aCloseWindowCommand;
  581.     
  582.     switch (aCmdNumber) {
  583.         case cAEAboutApp:
  584.             aNoChangesCommand = (TNoChangesCommand*)new TAEAboutAppCommand;
  585.             FailNIL(aNoChangesCommand);
  586.             aNoChangesCommand->INoChangesCommand(aCmdNumber, (TDocument*)nil, (TView*)nil, (TScroller*)nil);
  587.             return (TCommand*)aNoChangesCommand;
  588.         case cAENew:
  589.             aNewDocCommand = new TAENewDocCommand;
  590.             FailNIL(aNewDocCommand);
  591.             aNewDocCommand->IAENewDocCommand(aCmdNumber);
  592.             return (TCommand*)aNewDocCommand;
  593.         case cAEOpen:
  594.             aOldDocCommand = new TAEOldDocCommand;
  595.             FailNIL(aOldDocCommand);
  596.             aOldDocCommand->IAEOldDocCommand(aCmdNumber);
  597.             return (TCommand*)aOldDocCommand;
  598.         case cAEClose:
  599.             aCloseWindowCommand = new TAECloseWindowCommand;
  600.             FailNIL(aCloseWindowCommand);
  601.             aCloseWindowCommand->IAECloseWindowCommand(aCmdNumber);
  602.             return (TCommand*)aCloseWindowCommand;
  603.         case cQuit:
  604.             FailOSErr(AECreateAppleEvent(kCoreEventClass, kAEQuitApplication, &gCurrentTarget, kAutoGenerateReturnID, kAnyTransactionID, &aQuitAppleEvent));
  605.             FailOSErr(AESend(&aQuitAppleEvent, &reply, kAENoReply, kAENormalPriority, 0, (IdleProcPtr)nil, (EventFilterProcPtr)nil));
  606.             return gNoChanges;
  607.         case cSetSelf:
  608.             aNoChangesCommand = (TNoChangesCommand*)new TSetSelfCmd;
  609.             FailNIL(aNoChangesCommand);
  610.             aNoChangesCommand->INoChangesCommand(cSetSelf, (TDocument*)nil, (TView*)nil, (TScroller*)nil);
  611.             return (TCommand*)aNoChangesCommand;
  612.         case cSetTargetAddress:
  613.             aNoChangesCommand = (TNoChangesCommand*)new TSetTargetAddress;
  614.             FailNIL(aNoChangesCommand);
  615.             aNoChangesCommand->INoChangesCommand(cSetTargetAddress, (TDocument*)nil, (TView*)nil, (TScroller*)nil);
  616.             return (TCommand*)aNoChangesCommand;
  617.         case cLaunch:
  618.             aNoChangesCommand = (TNoChangesCommand*)new TLaunchApplication;
  619.             FailNIL(aNoChangesCommand);
  620.             aNoChangesCommand->INoChangesCommand(cLaunch, (TDocument*)nil, (TView*)nil, (TScroller*)nil);
  621.             return (TCommand*)aNoChangesCommand;
  622.         case cSound:
  623.             if (gSound == true)
  624.                 gSound = false;
  625.             else
  626.                 gSound = true;
  627.             break;
  628.         default:
  629.             return inherited::DoMenuCommand(aCmdNumber);
  630.     }
  631. }
  632.  
  633. // ------------------------------------------------------------------------------
  634. #pragma segment ARes
  635. pascal void TDrawApplication::DoSetupMenus()
  636. {
  637.     inherited::DoSetupMenus();    
  638.     Enable(cAEOpen,    true);
  639.     Enable(cAENew,        true);
  640.     Enable(cAEClose,    true);
  641.     Enable(cSetSelf,                true);
  642.     Enable(cSetTargetAddress,    true);
  643.     EnableCheck(cSetSelf,                true, gIsCurrentTargetSelf);
  644.     EnableCheck(cSetTargetAddress,    true, !gIsCurrentTargetSelf);
  645.     Enable(cLaunch, true);
  646.     Enable(cSound,    true);
  647.     EnableCheck(cSound, true,    gSound);
  648. }
  649.  
  650. //----------------------------------------------------------------------------
  651. #pragma segment ASelCommand
  652. pascal TCommand *TDrawApplication::HandleAlienEvent(EventInfo *theEventInfo)
  653. {
  654.     if (theEventInfo->thePEvent->what == kHighLevelEvent)
  655.         FailOSErr(AEProcessAppleEvent(theEventInfo->thePEvent));
  656.     return gNoChanges;
  657. }
  658.  
  659. //----------------------------------------------------------------------------
  660. #pragma segment AOpen
  661. pascal void TDrawApplication::HandleFinderRequest()
  662. {    
  663.                     // we need not handle request from Finder.
  664. }
  665.  
  666.  
  667. // ============================================================================
  668. #pragma segment AOpen
  669. pascal void TDrawDocument::IDrawDocument()
  670. {
  671.     fDrawList = NULL;                        // in case IDocument fails
  672.     this->IDocument(kFileType, kSignature, kUsesDataFork,
  673.             !kUsesRsrcFork, !kDataOpen, !kRsrcOpen);
  674.     fSavePrintInfo = true;
  675.     TList* aList = NewList();
  676.     fDrawList = aList;
  677.     fDrawList->SetEltType("\pTDraw");            // for Inspector window
  678.     this->SetColorCmd(cBlack);
  679.     this->SetLineCmd(cLineNormal);
  680. }
  681.  
  682. // ------------------------------------------------------------------------
  683. #pragma segment AClose
  684. pascal void TDrawDocument::Free()            //override
  685. {
  686.     if (fDrawList != NULL)
  687.         fDrawList->FreeList();    // free Draw objects and List object
  688.     inherited::Free();    
  689. }
  690.  
  691. // ------------------------------------------------------------------------
  692. #pragma segment ARes
  693. pascal void TDrawDocument::FreeData()        //override
  694. {
  695.     fDrawList->FreeAll();        // Revert: free Draw objects - not List object
  696. }
  697.  
  698. // ------------------------------------------------------------------------
  699. #pragma segment AOpen
  700. pascal void TDrawDocument::DoMakeViews(Boolean /* forPrinting */)
  701. {
  702.     TWindow* aWindow = NewTemplateWindow(kWindRsrcID, this);
  703.         
  704.     TDrawView* aDrawView = (TDrawView *) aWindow->FindSubView('Draw');    // type coercion
  705.     fDrawView = aDrawView;
  706.  
  707.     TPaletteView* aPaletteView = (TPaletteView *) aWindow->FindSubView('pall');     // type coercion
  708.     fPaletteView = aPaletteView;
  709.  
  710.     TLineView* aLineView = (TLineView *) aWindow->FindSubView('line');     // type coercion
  711.  
  712.     TStdPrintHandler* aStdHandler = new TStdPrintHandler;
  713.     FailNIL(aStdHandler);
  714.     aStdHandler->IStdPrintHandler(this, aDrawView, kSquareDots, 
  715.                                                 kFixedSize, kFixedSize);
  716. }
  717.  
  718.  
  719. // ------------------------------------------------------------------------------
  720. #pragma segment ASelCommand
  721. pascal void TDrawDocument::SetColorCmd(CmdNumber aCmdNumber)
  722. {
  723.     fColorCmdNumber = aCmdNumber;
  724. }
  725.  
  726.  
  727. // ------------------------------------------------------------------------------
  728. #pragma segment ASelCommand
  729. pascal CmdNumber TDrawDocument::GetColorCmd()
  730. {
  731.     return fColorCmdNumber;
  732. }
  733.  
  734. // ------------------------------------------------------------------------------
  735. #pragma segment ASelCommand
  736. pascal void TDrawDocument::SetLineCmd(CmdNumber aCmdNumber)
  737. {
  738.     fLineCmdNumber = aCmdNumber;
  739. }
  740.  
  741.  
  742. // ------------------------------------------------------------------------------
  743. #pragma segment ASelCommand
  744. pascal CmdNumber TDrawDocument::GetLineCmd()
  745. {
  746.     return fLineCmdNumber;
  747. }
  748.  
  749. // ------------------------------------------------------------------------------
  750. #pragma segment ARes
  751. pascal void TDrawDocument::DoSetupMenus()
  752. {
  753.     inherited::DoSetupMenus();            // always do this, so other objects get chance
  754.     if (this->FirstDraw() != NULL)
  755.         Enable(cDeleteFirst, true);
  756.     for (short colorIndex = cBlack; colorIndex <= cBlue; colorIndex++)
  757.         EnableCheck(colorIndex, true, (this->GetColorCmd() == colorIndex));
  758. }
  759.  
  760. // ------------------------------------------------------------------------------
  761. #pragma segment ASelCommand
  762. pascal TCommand *TDrawDocument::DoMenuCommand(CmdNumber aCmdNumber)
  763. {
  764.     switch (aCmdNumber){
  765.         case cBlack:
  766.         case cRed:
  767.         case cGreen:
  768.         case cBlue:
  769.             fPaletteView->ChangeSelection(aCmdNumber);
  770.             this->SetColorCmd(aCmdNumber);
  771.             return gNoChanges;
  772.             
  773.         case cDeleteFirst:
  774.             TDeleteCmd* aDeleteCmd = new TDeleteCmd;
  775.             FailNIL(aDeleteCmd);
  776.             aDeleteCmd->IDeleteCmd(fDrawView, this);
  777.             return aDeleteCmd;
  778.             
  779.         default:                            // always do this, so other objects get a chance
  780.             return inherited::DoMenuCommand(aCmdNumber);
  781.  
  782.     }  // switch
  783. }
  784.  
  785. // ------------------------------------------------------------------------
  786. #pragma segment ASelCommand
  787. pascal void TDrawDocument::AddDrawFirst(TDraw *aDraw)
  788. {
  789.     fDrawList->InsertFirst(aDraw);
  790. }
  791.  
  792.  
  793. // ------------------------------------------------------------------------
  794. #pragma segment ASelCommand
  795. pascal void TDrawDocument::AddDrawLast(TDraw *aDraw)
  796. {
  797.     fDrawList->InsertLast(aDraw);
  798. }
  799.  
  800.  
  801. // ------------------------------------------------------------------------
  802. #pragma segment ASelCommand
  803. pascal TDraw *TDrawDocument::FirstDraw()
  804. {
  805.     return (TDraw *) fDrawList->First();
  806. }
  807.  
  808.  
  809. // ------------------------------------------------------------------------
  810. #pragma segment ASelCommand
  811. pascal void TDrawDocument::DeleteDraw(TDraw *aDraw)
  812. {
  813.     fDrawList->Delete(aDraw);
  814. }
  815.  
  816. // ------------------------------------------------------------------------
  817. typedef pascal void    (*DoToObject)(TObject *anObject, void *link);
  818.  
  819. #pragma segment ARes
  820. pascal void TDrawDocument::ForEachDrawDo(DoToADrawProc DoToDraw, void *DoToDraw_StaticLink)
  821. {
  822.     fDrawList->Each((DoToObject) DoToDraw, DoToDraw_StaticLink);
  823. }
  824.  
  825. // ------------------------------------------------------------------------------
  826. #pragma segment AWriteFile
  827. pascal void TDrawDocument::DoNeedDiskSpace(long *dataForkBytes, long *rsrcForkBytes) 
  828. //    File format:
  829. //    Print info
  830. //    Integer - # Draws saved in the file
  831. //    Draw info #1
  832. //    Draw info #2
  833. //    etc.
  834. {
  835.     inherited::DoNeedDiskSpace(dataForkBytes, rsrcForkBytes);       // to save print info
  836.     ArrayIndex numberOfDraws = fDrawList->GetSize();
  837.     long numberOfDrawsBytes = sizeof(numberOfDraws);
  838.     TDraw *aDraw = new TDraw;
  839.     FailNIL(aDraw);
  840.     long DrawBytes = aDraw->ReturnBytes();
  841.     aDraw->Free();
  842.     *dataForkBytes += numberOfDrawsBytes + (DrawBytes * numberOfDraws);
  843. };
  844.  
  845. // ------------------------------------------------------------------------------
  846. #pragma segment AWriteFile
  847. pascal void WriteADraw(TDraw *aDraw, short *fileRefNumPtr)
  848. {
  849.     aDraw->WriteDraw(*fileRefNumPtr);
  850. }
  851.  
  852. // ------------------------------------------------------------------------------
  853. #pragma segment AWriteFile
  854. pascal void TDrawDocument::DoWrite(short aRefNum, Boolean makingCopy)
  855. {
  856.     inherited::DoWrite(aRefNum, makingCopy);                    // write print info 
  857.     ArrayIndex numberOfDraws = fDrawList->GetSize();
  858.     long  numberOfDrawsBytes = sizeof(numberOfDraws);
  859.     FailOSErr(FSWrite(aRefNum, &numberOfDrawsBytes, (Ptr) &numberOfDraws));  
  860.                                                                 // write # Draws
  861.     this->ForEachDrawDo((DoToADrawProc)WriteADraw, &aRefNum);    // each Draw writes itself
  862. };
  863.  
  864.  
  865. // ------------------------------------------------------------------------------
  866. #pragma segment AReadFile
  867. pascal void TDrawDocument::DoRead(short aRefNum, 
  868.                                     Boolean rsrcExists, Boolean forPrinting)
  869.     
  870. {
  871.     short    numberOfDraws;
  872.     TDraw    *aNewDraw;
  873.     long    dataBytes;
  874.     OSType    aShapeType;
  875.     
  876.     inherited::DoRead(aRefNum, rsrcExists, forPrinting);    // read printer info
  877.     long  numberOfDrawsBytes = sizeof(numberOfDraws);
  878.     FailOSErr(FSRead(aRefNum, &numberOfDrawsBytes, (Ptr) &numberOfDraws));     
  879.                                                     // read # Draws
  880.     dataBytes = sizeof(OSType);
  881.     for (short index = 0; index < numberOfDraws; index++){
  882.         FailOSErr(FSRead(aRefNum, &dataBytes, (Ptr) &aShapeType));
  883.         switch (aShapeType) {
  884.             case typeRectangle:
  885.                 aNewDraw =  (TDraw*)new TDrawingRect;
  886.                 break;
  887.             case typeOval:
  888.                 aNewDraw =  (TDraw*)new TDrawingOval;
  889.                 break;
  890.             case typeGraphicLine:
  891.                 aNewDraw =  (TDraw*)new TDrawingLine;
  892.                 break;
  893.             case typeRoundedRectangle:
  894.                 aNewDraw =    (TDraw*)new TDrawingRRect;
  895.                 break;
  896.             case typePICT:
  897.                 aNewDraw =    (TDraw*)new TDrawingPICT;
  898.                 break;
  899.             default:
  900.                 aNewDraw = new TDraw;
  901.                 break;
  902.         }
  903.         aNewDraw->ReadDraw(aRefNum);
  904.         this->AddDrawLast(aNewDraw);            // add it to the list
  905.     }
  906. }
  907.  
  908. // ------------------------------------------------------------------------
  909. #if qInspector
  910. #pragma segment AFields
  911. pascal void TDrawDocument::Fields(pascal void (*DoToField)(StringPtr fieldName, Ptr fieldAddr, short 
  912.     fieldType, void *DoToField_StaticLink), void *DoToField_StaticLink)
  913.  
  914.   {
  915.     DoToField("\pTDrawDocument", NULL, bClass, DoToField_StaticLink);
  916.     DoToField("\pfDrawView", (Ptr) &fDrawView, bObject, DoToField_StaticLink);
  917.     DoToField("\pfPaletteView", (Ptr) &fPaletteView, bObject, DoToField_StaticLink);
  918.     DoToField("\pfDrawList", (Ptr) &fDrawList, bObject, DoToField_StaticLink);
  919.     DoToField("\pfColorCmdNumber", (Ptr) &fColorCmdNumber, bCmdNumber, DoToField_StaticLink);
  920.     inherited::Fields(DoToField, DoToField_StaticLink);
  921.   }
  922. #endif
  923.  
  924. // ============================== Draw View =================================
  925. #pragma segment AOpen
  926. pascal void TDrawView::IRes(TDocument *itsDocument,
  927.                          TView *itsSuperView, Ptr *itsParams)
  928. {
  929.     inherited::IRes(itsDocument, itsSuperView, itsParams);    
  930.     fDrawDocument = (TDrawDocument *) itsDocument;
  931.     fIdleFreq = 0;                                                    // so DoSetCursor gets called often    
  932. }
  933.  
  934. // ------------------------------------------------------------------------
  935. #pragma segment ASelCommand
  936. pascal TCommand* TDrawView::DoMouseCommand(Point*      /* theMouse */,
  937.                                                         EventInfo*    /* info */, 
  938.                                                          Point*        /* hysteresis*/)
  939. {
  940.     TSketcher* aSketcher = new TSketcher;
  941.     FailNIL(aSketcher);
  942.     TShapeGridView* aShapeGridView = (TShapeGridView*)this->GetWindow()->FindSubView('Gshp');
  943.     this->fShapeType = aShapeGridView->GetShapeType();
  944.     aSketcher->ISketcher(this, fDrawDocument, this->fShapeType);    // itsDocument
  945.     return aSketcher;    
  946. };
  947.  
  948. // ------------------------------------------------------------------------
  949. #pragma segment ARes
  950. pascal Boolean    TDrawView::DoSetCursor(Point /* localPoint */, 
  951.                                                   RgnHandle cursorRgn)
  952. {
  953.     Rect    viewBorder;
  954.     
  955.     SetCursor(*GetCursor(crossCursor));                // "+" shape
  956.     this->GetQDExtent(&viewBorder);
  957.     RectRgn(cursorRgn, &viewBorder);
  958.     return true;
  959. }
  960.  
  961. // ------------------------------------------------------------------------
  962. pascal void DrawADraw(TDraw *aDraw, Rect *updateArea)
  963. {
  964.     Rect DrawRect = aDraw->ReturnFrame();
  965.     if (SectRect(&DrawRect, updateArea, &DrawRect))
  966.         aDraw->DrawDraw();
  967. }
  968.         
  969. // ------------------------------------------------------------------------
  970. #pragma segment ARes
  971. pascal void TDrawView::Draw(Rect *area)
  972. {
  973.     fDrawDocument->ForEachDrawDo((DoToADrawProc) DrawADraw, area);
  974. }
  975.  
  976. /// ------------------------------------------------------------------------
  977. #pragma segment DoMouseCommand
  978. pascal void TDrawView::TrackFeedback(VPoint *anchorPoint, VPoint *nextPoint, Boolean /* turnItOn */, Boolean mouseDidMove)
  979. {
  980.     VRect        vr;
  981.     Rect        r;
  982.     
  983.     if (mouseDidMove) {
  984.         Pt2VRect(anchorPoint, nextPoint, &vr);
  985.         ViewToQDRect(&vr, &r);
  986.         PenPat((ConstPatternParam)qd.gray);
  987.         switch (fShapeType) {
  988.             case typeGraphicLine:
  989.                 MoveTo(ViewToQDPt(anchorPoint).h, ViewToQDPt(anchorPoint).v);
  990.                 LineTo(ViewToQDPt(nextPoint).h, ViewToQDPt(nextPoint).v);
  991.                 break;
  992.             case typeRectangle:
  993.                 FrameRect(&r);
  994.                 break;
  995.             case typeOval:
  996.                 FrameOval(&r);
  997.                 break;
  998.             case typeRoundedRectangle:
  999.                 FrameRoundRect(&r, 16, 16);
  1000.                 break;
  1001.             case typePICT:
  1002.                 FrameRect(&r);
  1003.                 break;
  1004.             default:
  1005.                 FrameRect(&r);
  1006.                 break;
  1007.         }
  1008.     }
  1009. }
  1010.  
  1011. // ============================== Palette View =================================
  1012. #pragma segment AOpen
  1013. pascal void TPaletteView::IRes(TDocument *itsDocument,
  1014.                                           TView *itsSuperView, Ptr *itsParams)
  1015. {
  1016.     inherited::IRes(itsDocument, itsSuperView, itsParams);    
  1017.     fDrawDocument = (TDrawDocument *) itsDocument;
  1018. }
  1019.  
  1020.  
  1021. // -----------------------------------------------------------------------------
  1022. #pragma segment ARes
  1023. pascal void TPaletteView::Draw(Rect*  /* area */)
  1024. {
  1025.     Rect    aFrame;
  1026.     
  1027.     for (short colorIndex = cBlack; colorIndex <= cBlue; colorIndex++){
  1028.         RGBForeColor(&gColorArray[colorIndex - cBlack]);
  1029.         PaintRect(&gColorRect[colorIndex - cBlack]);
  1030.     }
  1031.     ForeColor(blackColor);
  1032.     this->GetQDExtent(&aFrame);
  1033. //    SetPt(&aPenSize, 1, 1);
  1034. //    this->Adorn(&aFrame, aPenSize, adnLineBottom);
  1035. }
  1036.  
  1037. // --------------------------- called after .Draw -------------------------------
  1038. #pragma segment ARes
  1039. pascal void TPaletteView::DoHighlightSelection(HLState fromHL, HLState toHL)
  1040. {
  1041.     PenSize(4,4);
  1042.     Rect aRect = gColorRect[fDrawDocument->GetColorCmd() - cBlack];
  1043.     aRect.bottom--;
  1044.     SetHLPenState(fromHL, toHL);
  1045.     FrameRect(&aRect);
  1046.     PenNormal();
  1047. }
  1048.  
  1049.  
  1050. // ----------------------------------------------------------------------------
  1051. #pragma segment ASelCommand
  1052. pascal void TPaletteView::ChangeSelection(CmdNumber newColorNumber)
  1053. {
  1054.     CmdNumber currentColorNumber = fDrawDocument->GetColorCmd();    
  1055.     if (newColorNumber != currentColorNumber){
  1056.         if (Focus()) this->DoHighlightSelection(hlOn, hlOff);    // turn off old
  1057.         fDrawDocument->SetColorCmd(newColorNumber);
  1058.         if (Focus()) this->DoHighlightSelection(hlOff, hlOn);    // turn on new
  1059.     }    // if
  1060. }
  1061.  
  1062. // ----------------------------------------------------------------------------
  1063. #pragma segment ASelCommand
  1064. pascal TCommand* TPaletteView::DoMouseCommand(Point*        theMouse,
  1065.                                                              EventInfo*    /* info */, 
  1066.                                                              Point*        /* hysteresis */)
  1067. {
  1068.     CmdNumber newColorCmd = (theMouse->h / kIconWidth) + cBlack;
  1069.     if ((newColorCmd <= cBlue))
  1070.         this->ChangeSelection(newColorCmd);
  1071.     return gNoChanges;                            // not "Undo"able
  1072. }
  1073.  
  1074.  
  1075. // ----------------------------------------------------------------------------
  1076. #if qInspector
  1077. #pragma segment AFields
  1078. pascal void TPaletteView::Fields(pascal void (*DoToField)(StringPtr fieldName, Ptr fieldAddr, short 
  1079.     fieldType, void *DoToField_StaticLink), void *DoToField_StaticLink)
  1080. {
  1081.     DoToField("\pTPaletteView", NULL, bClass, DoToField_StaticLink);
  1082.     DoToField("\pfDrawDocument", (Ptr) &fDrawDocument, bObject, DoToField_StaticLink);
  1083.     inherited:: Fields(DoToField, DoToField_StaticLink);
  1084. };
  1085. #endif
  1086.  
  1087. // ============================== Line View =================================
  1088. #pragma segment AOpen
  1089. pascal void TLineView::IRes(TDocument *itsDocument,
  1090.                                           TView *itsSuperView, Ptr *itsParams)
  1091. {
  1092.     inherited::IRes(itsDocument, itsSuperView, itsParams);    
  1093.     fDrawDocument = (TDrawDocument *) itsDocument;
  1094. }
  1095.  
  1096.  
  1097. // ----------------------------------------------------------------------------
  1098. #pragma segment ASelCommand
  1099. pascal void TLineView::ChangeSelection(CmdNumber newLineNumber)
  1100. {
  1101.     CmdNumber currentLineNumber = fDrawDocument->GetLineCmd();    
  1102.     if (newLineNumber != currentLineNumber){
  1103.         if (Focus()) this->DoHighlightSelection(hlOn, hlOff);    // turn off old
  1104.         fDrawDocument->SetLineCmd(newLineNumber);
  1105.         if (Focus()) this->DoHighlightSelection(hlOff, hlOn);    // turn on new
  1106.     }    // if
  1107. }
  1108. // -----------------------------------------------------------------------------
  1109. #pragma segment ARes
  1110. pascal void TLineView::Draw(Rect*  /* area */)
  1111. {
  1112.     Point    aPenSize;
  1113.     Rect    aFrame;
  1114.     
  1115.     ForeColor(blackColor);
  1116.     for (short lineIndex = 1; lineIndex < 5; lineIndex++){
  1117.         PenSize(1, lineIndex);
  1118.         MoveTo(gLineRect[lineIndex-1].left + 2, gLineRect[lineIndex-1].top + 3);
  1119.         Line(16, 0);
  1120.     }
  1121.     this->GetQDExtent(&aFrame);
  1122.     SetPt(&aPenSize, 1, 1);
  1123.     this->Adorn(&aFrame, aPenSize, adnLineBottom + adnLineTop + adnLineRight + adnLineLeft);
  1124.  
  1125. }
  1126.  
  1127. // ----------------------------------------------------------------------------
  1128. #pragma segment ARes
  1129. pascal void TLineView::DoHighlightSelection(HLState fromHL, HLState toHL)
  1130. {
  1131.     Rect        viewBorder;
  1132.     
  1133.     PenNormal();
  1134.     Rect aRect = gLineRect[fDrawDocument->GetLineCmd() - cLineNormal];
  1135.     SetHLPenState(fromHL, toHL);
  1136.     if ((fromHL == hlOn) && (toHL == hlOff)) {
  1137.         this->GetQDExtent(&viewBorder);
  1138.         InsetRect(&viewBorder, 1, 1);
  1139.         viewBorder.left = 22;
  1140.         EraseRect(&viewBorder);
  1141.     }
  1142.     else {
  1143.         PicHandle aPicHandle = GetPicture(1002);
  1144.         FailNIL(aPicHandle);
  1145.         Rect destRect = (**aPicHandle).picFrame;
  1146.         OffsetRect(&destRect, -destRect.left, -destRect.top);
  1147.         OffsetRect(&destRect, aRect.left + 24, aRect.top+1);
  1148.         DrawPicture(aPicHandle, &destRect);
  1149.     }
  1150. }
  1151.  
  1152. // ----------------------------------------------------------------------------
  1153. #pragma segment ASelCommand
  1154. pascal TCommand* TLineView::DoMouseCommand(Point*        theMouse,
  1155.                                                              EventInfo*    /* info */, 
  1156.                                                              Point*        /* hysteresis */)
  1157. {
  1158.     CmdNumber newLineCmd = (theMouse->v / 16) + cLineNormal;
  1159.     if ((newLineCmd < cLineNormal + 4))
  1160.         this->ChangeSelection(newLineCmd);
  1161.     return gNoChanges;                            // not "Undo"able
  1162. }
  1163.  
  1164. // =========================================================================
  1165. #pragma segment ASelCommand
  1166. pascal void TDraw::IDraw(const Rect *size, RGBColor *itsColor, ConstPatternParam *itsPattern, short itsLineSize)
  1167. {
  1168.     fFrame = *size;
  1169.     fColor = *itsColor;
  1170.     fShapeType = 'dflt';
  1171.     memcpy(&fPattern, itsPattern, 8);
  1172.     fLineSize = itsLineSize;
  1173. }
  1174.  
  1175. // ------------------------------------------------------------------------
  1176. #pragma segment ARes
  1177. pascal void TDraw::DrawDraw()    
  1178. {
  1179.     RGBForeColor(&fColor);
  1180.     Handle aHandle = GetIcon(2);
  1181.     FailNILResource(aHandle);
  1182.     Rect  aRect = this->ReturnFrame();
  1183.     PlotIcon(&aRect, aHandle);
  1184.     ForeColor(blackColor);
  1185. }
  1186.  
  1187. // ------------------------------------------------------------------------
  1188. #pragma segment ASelCommand
  1189. pascal Rect TDraw::ReturnFrame()
  1190. {
  1191.     return fFrame;
  1192. }
  1193.  
  1194. // -----------------------------------------------------------------------------
  1195. #pragma segment AWriteFile
  1196. pascal long TDraw::ReturnBytes()
  1197. {
  1198.     return sizeof(fFrame) + sizeof(fColor) + sizeof(fPattern) + sizeof(fLineSize);
  1199. }
  1200.  
  1201.  
  1202. // -----------------------------------------------------------------------------
  1203. #pragma segment AReadFile
  1204. pascal void TDraw::ReadDraw(short aRefNum)
  1205. {
  1206.     long dataBytes = this->ReturnBytes();    // data = frame + color + fPattern + fLineSize
  1207.     FailOSErr(FSRead(aRefNum, &dataBytes, (Ptr) &fFrame));
  1208. }   
  1209.  
  1210. // ------------------------------------------------------------------------
  1211. #pragma segment AWriteFile
  1212. pascal void TDraw::WriteDraw(short aRefNum)
  1213. {
  1214.     long dataBytes;
  1215.     
  1216.     dataBytes = sizeof(fShapeType);
  1217.     FailOSErr(FSWrite(aRefNum, &dataBytes, (Ptr) &fShapeType));
  1218.     dataBytes = this->ReturnBytes();
  1219.     FailOSErr(FSWrite(aRefNum, &dataBytes, (Ptr) &fFrame));
  1220. }
  1221.  
  1222. // ------------------------------------------------------------------------
  1223. #if qInspector
  1224. #pragma segment AFields
  1225. pascal void TDraw::Fields(pascal void (*DoToField)(StringPtr fieldName, Ptr fieldAddr, short 
  1226.     fieldType, void *DoToField_StaticLink), void *DoToField_StaticLink)
  1227. {
  1228.     DoToField("\pTDraw", NULL, bClass, DoToField_StaticLink);
  1229.     DoToField("\pfFrame", (Ptr) &fFrame, bRect, DoToField_StaticLink);
  1230.     DoToField("\pfColor", (Ptr) &fColor, bInteger, DoToField_StaticLink);
  1231.     inherited::Fields(DoToField, DoToField_StaticLink);
  1232. };
  1233. #endif
  1234.  
  1235.  
  1236. // =========================================================================
  1237. #pragma segment ASelCommand
  1238. pascal void TDrawingRect::IDraw(const Rect *size, RGBColor *itsColor, ConstPatternParam *itsPattern, short itsLineSize)
  1239. {
  1240.     inherited::IDraw(size, itsColor, itsPattern, itsLineSize);
  1241.     fShapeType = typeRectangle;
  1242. }
  1243.  
  1244. // ------------------------------------------------------------------------
  1245. #pragma segment ARes
  1246. pascal void TDrawingRect::DrawDraw()    
  1247. {
  1248.     Pattern    aPat;
  1249.     
  1250.     RGBForeColor(&fColor);
  1251.     Rect  aRect = this->ReturnFrame();
  1252.     PenNormal();
  1253.     PenSize(fLineSize, fLineSize);
  1254.     unsigned char pp = 0;
  1255.     for(short i=0;i<8;i++)
  1256.         pp = pp + fPattern[i];
  1257.     if (pp == 0) {
  1258.         FrameRect(&aRect);
  1259.     }
  1260.     else {
  1261.         PenPat((ConstPatternParam)fPattern);
  1262.         PaintRect(&aRect);
  1263.     }
  1264.     PenNormal();
  1265.     ForeColor(blackColor);
  1266. }
  1267.  
  1268. // =========================================================================
  1269. #pragma segment ASelCommand
  1270. pascal void TDrawingOval::IDraw(const Rect *size, RGBColor *itsColor, ConstPatternParam *itsPattern, short itsLineSize)
  1271. {
  1272.     inherited::IDraw(size, itsColor, itsPattern, itsLineSize);
  1273.     fShapeType = typeOval;
  1274. }
  1275.  
  1276. // ------------------------------------------------------------------------
  1277. #pragma segment ARes
  1278. pascal void TDrawingOval::DrawDraw()    
  1279. {
  1280.     Pattern    aPat;
  1281.     
  1282.     RGBForeColor(&fColor);
  1283.     Rect  aRect = this->ReturnFrame();
  1284.     PenNormal();
  1285.     PenSize(fLineSize, fLineSize);
  1286.     unsigned char pp = 0;
  1287.     for(short i=0;i<8;i++)
  1288.         pp = pp + fPattern[i];
  1289.     if (pp == 0) {
  1290.         FrameOval(&aRect);
  1291.     }
  1292.     else {
  1293.         PenPat((ConstPatternParam)fPattern);
  1294.         PaintOval(&aRect);
  1295. //        FillOval(&aRect, (ConstPatternParam)fPattern);
  1296.     }
  1297.     PenNormal();
  1298.     ForeColor(blackColor);
  1299. }
  1300.  
  1301. // =========================================================================
  1302. #pragma segment ASelCommand
  1303. pascal void TDrawingLine::IDraw(const Rect *size, RGBColor *itsColor, ConstPatternParam *itsPattern, short itsLineSize)
  1304. {
  1305.     inherited::IDraw(size, itsColor, itsPattern, itsLineSize);
  1306.     fShapeType = typeGraphicLine;
  1307. }
  1308.  
  1309. // ------------------------------------------------------------------------
  1310. #pragma segment ARes
  1311. pascal void TDrawingLine::DrawDraw()    
  1312. {
  1313.  
  1314.     RGBForeColor(&fColor);
  1315.     Rect  aRect = this->ReturnFrame();
  1316.     PenNormal();
  1317.     PenSize(fLineSize, fLineSize);
  1318.     MoveTo(fStartPoint.h, fStartPoint.v);
  1319.     LineTo(fEndPoint.h, fEndPoint.v);
  1320.     ForeColor(blackColor);
  1321. }
  1322.  
  1323. // -----------------------------------------------------------------------------
  1324. #pragma segment AWriteFile
  1325. pascal long TDrawingLine::ReturnBytes()
  1326. {
  1327.     return inherited::ReturnBytes() + sizeof(fStartPoint) + sizeof(fEndPoint);
  1328. }
  1329.  
  1330.  
  1331. // -----------------------------------------------------------------------------
  1332. #pragma segment AReadFile
  1333. pascal void TDrawingLine::ReadDraw(short aRefNum)
  1334. {
  1335.     inherited::ReadDraw(aRefNum);
  1336.     long dataBytes = sizeof(fStartPoint) + sizeof(fEndPoint);
  1337.     FailOSErr(FSRead(aRefNum, &dataBytes, (Ptr) &fStartPoint));
  1338.     
  1339. }   
  1340.  
  1341. // ------------------------------------------------------------------------
  1342. #pragma segment AWriteFile
  1343. pascal void TDrawingLine::WriteDraw(short aRefNum)
  1344. {
  1345.     long dataBytes;
  1346.     
  1347.     inherited::WriteDraw(aRefNum);
  1348.     dataBytes = sizeof(fStartPoint) + sizeof(fEndPoint);
  1349.     FailOSErr(FSWrite(aRefNum, &dataBytes, (Ptr) &fStartPoint));
  1350. }
  1351.  
  1352. // ------------------------------------------------------------------------
  1353. #pragma segment ARes
  1354. pascal void TDrawingLine::IStartEnd(Point startPoint, Point endPoint)
  1355. {
  1356.     fStartPoint = startPoint;
  1357.     fEndPoint = endPoint;
  1358. }
  1359.  
  1360. // =========================================================================
  1361. #pragma segment ASelCommand
  1362. pascal void TDrawingRRect::IDraw(const Rect *size, RGBColor *itsColor, ConstPatternParam *itsPattern, short itsLineSize)
  1363. {
  1364.     inherited::IDraw(size, itsColor, itsPattern, itsLineSize);
  1365.     fShapeType = typeRoundedRectangle;
  1366. }
  1367.  
  1368. // ------------------------------------------------------------------------
  1369. #pragma segment ARes
  1370. pascal void TDrawingRRect::DrawDraw()    
  1371. {
  1372.     Pattern    aPat;
  1373.     
  1374.     RGBForeColor(&fColor);
  1375.     Rect  aRect = this->ReturnFrame();
  1376.     PenNormal();
  1377.     PenSize(fLineSize, fLineSize);
  1378.     unsigned char pp = 0;
  1379.     for(short i=0;i<8;i++)
  1380.         pp = pp + fPattern[i];
  1381.     if (pp == 0) {
  1382.         FrameRoundRect(&aRect, fOval.h, fOval.v);
  1383.     }
  1384.     else {
  1385.         PenPat((ConstPatternParam)fPattern);
  1386.         PaintRoundRect(&aRect, fOval.h, fOval.v);
  1387. //        FillRoundRect(&aRect, fOval.h, fOval.v, (ConstPatternParam)fPattern);
  1388.     }
  1389.     ForeColor(blackColor);
  1390. }
  1391.  
  1392. // -----------------------------------------------------------------------------
  1393. #pragma segment AWriteFile
  1394. pascal long TDrawingRRect::ReturnBytes()
  1395. {
  1396.     return inherited::ReturnBytes() + sizeof(fOval);
  1397. }
  1398.  
  1399.  
  1400. // -----------------------------------------------------------------------------
  1401. #pragma segment AReadFile
  1402. pascal void TDrawingRRect::ReadDraw(short aRefNum)
  1403. {
  1404.     inherited::ReadDraw(aRefNum);
  1405.     long dataBytes = sizeof(fOval);
  1406.     FailOSErr(FSRead(aRefNum, &dataBytes, (Ptr) &fOval));
  1407.     
  1408. }   
  1409.  
  1410. // ------------------------------------------------------------------------
  1411. #pragma segment AWriteFile
  1412. pascal void TDrawingRRect::WriteDraw(short aRefNum)
  1413. {
  1414.     long dataBytes;
  1415.     
  1416.     inherited::WriteDraw(aRefNum);
  1417.     dataBytes = sizeof(fOval);
  1418.     FailOSErr(FSWrite(aRefNum, &dataBytes, (Ptr) &fOval));
  1419. }
  1420.  
  1421. // ------------------------------------------------------------------------
  1422. #pragma segment ARes
  1423. pascal void TDrawingRRect::ISetOval(Point ovalSize)
  1424. {
  1425.     fOval = ovalSize;
  1426. }
  1427.  
  1428. // =========================================================================
  1429. #pragma segment ASelCommand
  1430. pascal void TDrawingPICT::IDraw(const Rect *size, RGBColor *itsColor, ConstPatternParam *itsPattern, short itsLineSize)
  1431. {
  1432.     inherited::IDraw(size, itsColor, itsPattern, itsLineSize);
  1433.     fShapeType = typePICT;
  1434. }
  1435.  
  1436. // ------------------------------------------------------------------------
  1437. #pragma segment ARes
  1438. pascal void TDrawingPICT::DrawDraw()    
  1439. {
  1440.     DrawPicture(fPicHandle, &(**fPicHandle).picFrame);    
  1441. }
  1442.  
  1443. // -----------------------------------------------------------------------------
  1444. #pragma segment AWriteFile
  1445. pascal long TDrawingPICT::ReturnBytes()
  1446. {
  1447.     return inherited::ReturnBytes() + sizeof(Size) + GetHandleSize((Handle)fPicHandle);
  1448. }
  1449.  
  1450.  
  1451. // -----------------------------------------------------------------------------
  1452. #pragma segment AReadFile
  1453. pascal void TDrawingPICT::ReadDraw(short aRefNum)
  1454. {
  1455.     Size    aPicSize;
  1456.  
  1457.     inherited::ReadDraw(aRefNum);
  1458.     long dataBytes = sizeof(Size);
  1459.     FailOSErr(FSRead(aRefNum, &dataBytes, (Ptr)&aPicSize));
  1460.     fPicHandle = (PicHandle)NewHandle(aPicSize);
  1461.     dataBytes = aPicSize;
  1462.     FailOSErr(FSRead(aRefNum, &dataBytes, (Ptr)(*fPicHandle)));
  1463.     
  1464. }   
  1465.  
  1466. // ------------------------------------------------------------------------
  1467. #pragma segment AWriteFile
  1468. pascal void TDrawingPICT::WriteDraw(short aRefNum)
  1469. {
  1470.     long dataBytes;
  1471.     Size aPicSize;
  1472.     
  1473.     inherited::WriteDraw(aRefNum);
  1474.     dataBytes = sizeof(Size);
  1475.     aPicSize = GetHandleSize((Handle)fPicHandle);
  1476.     FailOSErr(FSWrite(aRefNum, &dataBytes, (Ptr)&aPicSize));
  1477.     dataBytes = aPicSize;
  1478.     FailOSErr(FSWrite(aRefNum, &dataBytes, (Ptr)(*fPicHandle)));
  1479. }
  1480.  
  1481. // ------------------------------------------------------------------------
  1482. #pragma segment ARes
  1483. pascal void TDrawingPICT::ISetPICT(PicHandle itsPICTHandle)
  1484. {
  1485.     fPicHandle = itsPICTHandle;
  1486. }
  1487.  
  1488. // =========================== Command Object ================================
  1489. #pragma segment ASelCommand
  1490. pascal void TSketcher::ISketcher(TDrawView *itsView, TDrawDocument *itsDocument, OSType itsShapeType)
  1491. {
  1492.     fDraw = NULL;
  1493.     fDrawView = itsView;
  1494.     fDrawDocument = itsDocument;
  1495.     TScroller* aScroller = itsView->GetScroller(true);
  1496.     fShapeType = itsShapeType;
  1497.     this->ICommand(cSketcher,                     // itsCmdNumber
  1498.                         itsDocument,                // itsDocument
  1499.                         itsView,                     // itsView
  1500.                         aScroller);                    // itsScroller
  1501.     fConstrainsMouse = false;            // do not call TrackConstrain
  1502. }
  1503.  
  1504.  
  1505. // ------------------------------------------------------------------------------
  1506. #pragma segment ARes
  1507. pascal TCommand *TSketcher::TrackMouse(TrackPhase aTrackPhase,
  1508.                                                     VPoint*  anchorPoint, 
  1509.                                                     VPoint*  /* previousPoint */, 
  1510.                                                     VPoint*  nextPoint,
  1511.                                                     Boolean  /* mouseDidMove */)
  1512. {    
  1513.     AppleEvent    qdAppleEvent;
  1514.     AppleEvent    qdReply;
  1515.     Rect            pBounds;
  1516.     Rect            pDefRect;
  1517.     VRect            pVDefRect;
  1518.     short            pTransferMode;
  1519.     long            pShape;
  1520.     Point         pStartPoint;
  1521.     Point            pEndPoint;
  1522.     Pattern        pPenPattern;
  1523.     Pattern        pFillPattern;
  1524.     short            pLineArrow;
  1525.     short            pPenWidth;
  1526.     short            pCurveHeight;
  1527.     short            pCurveWidth;
  1528.     RGBColor        pPenColor;
  1529.     RGBColor        pFillColor;
  1530.     Str255        docName;
  1531.     PicHandle    pPicHandle;
  1532.     GrafPtr        oldGrafPort;
  1533.     
  1534.     if (aTrackPhase == trackRelease){
  1535.         CmdNumber currentDocColor = fDrawDocument->GetColorCmd();
  1536.         TWindow* aWindow = fDrawView->GetWindow();
  1537.         TShapeGridView* aShapeGridView = (TShapeGridView*)aWindow->FindSubView('Gshp');
  1538.         TPatternView* aPatternView = (TPatternView*)aWindow->FindSubView('patt');
  1539.         pPenWidth = fDrawDocument->GetLineCmd() - cLineNormal +1;
  1540.         
  1541.         FailOSErr(AECreateAppleEvent(kAEQDGraphicsSuite, kAEEditGraphic, &gCurrentTarget, kAutoGenerateReturnID, kAnyTransactionID, &qdAppleEvent)); 
  1542.         pBounds.top        = 0;
  1543.         pBounds.left    = 0;
  1544.         pBounds.bottom    = (short)fDrawView->fSize.v;
  1545.         pBounds.right    = (short)fDrawView->fSize.h;
  1546.         FailOSErr(AEPutParamPtr(&qdAppleEvent, keyAEBounds, typeQDRectangle, (Ptr)&pBounds, sizeof(Rect)));
  1547.         pTransferMode = srcCopy;
  1548.         FailOSErr(AEPutParamPtr(&qdAppleEvent, keyAETransferMode, typeEnumeration, (Ptr)&pTransferMode, sizeof(short)));
  1549.         pShape = aShapeGridView->GetShapeType();
  1550.         switch (pShape) {
  1551.             case typeGraphicLine:
  1552.                     pStartPoint = fDrawView->ViewToQDPt(anchorPoint);
  1553.                     pEndPoint     = fDrawView->ViewToQDPt(nextPoint);
  1554.                     pDefRect = pBounds;
  1555.                     pPenColor = gColorArray[currentDocColor - cBlack];
  1556.                     pLineArrow = 0;                // no allow
  1557.                     memcpy(&pPenPattern, &qd.black, 8);
  1558.                     FailOSErr(AEPutParamPtr(&qdAppleEvent, keyAEStartPoint,        typeQDPoint,        (Ptr)&pStartPoint,    sizeof(Point)));
  1559.                     FailOSErr(AEPutParamPtr(&qdAppleEvent, keyAEEndPoint,            typeQDPoint,        (Ptr)&pEndPoint,        sizeof(Point)));
  1560.                     FailOSErr(AEPutParamPtr(&qdAppleEvent, keyAEDefinitionRect, typeQDRectangle,    (Ptr)&pDefRect,        sizeof(Rect)));
  1561.                     FailOSErr(AEPutParamPtr(&qdAppleEvent, keyAEPenColor,         typeRGBColor,        (Ptr)&pPenColor,        sizeof(RGBColor)));
  1562.                     FailOSErr(AEPutParamPtr(&qdAppleEvent, keyAELineArrow,        typeEnumeration,    (Ptr)&pLineArrow,        sizeof(short)));
  1563.                     FailOSErr(AEPutParamPtr(&qdAppleEvent, keyAEPenPattern,        typePattern,        (Ptr)&pPenPattern,    sizeof(Pattern)));
  1564.                     FailOSErr(AEPutParamPtr(&qdAppleEvent, keyAEPenWidth,            typeShortInteger, (Ptr)&pPenWidth,        sizeof(short)));
  1565.                     break;
  1566.                 case typeRectangle:
  1567.                 case typeOval:
  1568.                 case typeRoundedRectangle:
  1569.                     Pt2VRect(anchorPoint, nextPoint, &pVDefRect);
  1570.                     fDrawView->ViewToQDRect(&pVDefRect, &pDefRect);
  1571.                     pFillColor = gColorArray[currentDocColor - cBlack];
  1572.                     aPatternView->GetPattern(pFillPattern);
  1573.                     pPenColor = gColorArray[currentDocColor - cBlack];
  1574.                     aPatternView->GetPattern(pPenPattern);
  1575.                     FailOSErr(AEPutParamPtr(&qdAppleEvent, keyAEDefinitionRect, typeQDRectangle,    (Ptr)&pDefRect,        sizeof(Rect)));
  1576.                     FailOSErr(AEPutParamPtr(&qdAppleEvent,    keyAEFillColor,        typeRGBColor,        (Ptr)&pFillColor,        sizeof(RGBColor)));
  1577.                     FailOSErr(AEPutParamPtr(&qdAppleEvent,    keyAEFillPattern,        typePattern,        (Ptr)&pFillPattern,    sizeof(Pattern)));
  1578.                     FailOSErr(AEPutParamPtr(&qdAppleEvent, keyAEPenColor,            typeRGBColor,        (Ptr)&pPenColor,        sizeof(RGBColor)));
  1579.                     FailOSErr(AEPutParamPtr(&qdAppleEvent, keyAEPenPattern,        typePattern,        (Ptr)&pPenPattern,    sizeof(Pattern)));
  1580.                     FailOSErr(AEPutParamPtr(&qdAppleEvent, keyAEPenWidth,            typeShortInteger,    (Ptr)&pPenWidth,        sizeof(short)));
  1581.                     if (pShape == typeRoundedRectangle) {
  1582.                         pCurveHeight    = gOvalSize.v;
  1583.                         pCurveWidth        = gOvalSize.h;
  1584.                         FailOSErr(AEPutParamPtr(&qdAppleEvent, keyAECurveHeight,        typeShortInteger,    (Ptr)&pCurveHeight,    sizeof(short)));
  1585.                         FailOSErr(AEPutParamPtr(&qdAppleEvent, keyAECurveWidth,        typeShortInteger,    (Ptr)&pCurveWidth,    sizeof(short)));
  1586.                     }
  1587.                     break;
  1588.                 case typePICT:
  1589.                     Pt2VRect(anchorPoint, nextPoint, &pVDefRect);
  1590.                     fDrawView->ViewToQDRect(&pVDefRect, &pDefRect);
  1591.                     GetPort(&oldGrafPort);
  1592.                     SetPort(fView->GetGrafPort());
  1593.                     pPicHandle = OpenPicture(&pDefRect);
  1594.                     fDrawView->Draw(&pDefRect);
  1595.                     ClosePicture();
  1596.                     SetPort(oldGrafPort);
  1597.                     FailOSErr(AEPutParamPtr(&qdAppleEvent, keyAEGraphicObjects, typePICT, (Ptr)(*pPicHandle), GetHandleSize((Handle)pPicHandle)));
  1598.                     KillPicture(pPicHandle);
  1599.                     break;
  1600.         }
  1601.         FailOSErr(AEPutParamPtr(&qdAppleEvent, keyAEShape, typeType, (Ptr)&pShape,    sizeof(long)));
  1602.         FailOSErr(AESend(&qdAppleEvent, &qdReply, kAENoReply, kAENormalPriority, 0, (IdleProcPtr)nil, (EventFilterProcPtr)nil));
  1603.     }    // if (trackRelease
  1604.     return this;
  1605. }
  1606.  
  1607. // ------------------------------------------------------------------------------
  1608. #pragma segment ADoCommand
  1609. pascal void TSketcher::DoIt()
  1610. {
  1611. }
  1612.  
  1613. // ------------------------------------------------------------------------------
  1614. #pragma segment ADoCommand
  1615. pascal void TSketcher::RedoIt()
  1616. {
  1617.     this->DoIt();
  1618. }
  1619.  
  1620. // ------------------------------------------------------------------------------
  1621. #pragma segment ADoCommand
  1622. pascal void TSketcher::UndoIt()
  1623. {
  1624. //    fDrawDocument->DeleteDraw(fDraw);
  1625. //    Rect DrawRect = fDraw->ReturnFrame();
  1626. //    fDrawView->InvalidRect(&DrawRect);        // force update
  1627. }
  1628.  
  1629. // ------------------------------------------------------------------------------
  1630. #pragma segment AClose
  1631. pascal void TSketcher::Free()
  1632. {
  1633.     if (!fCmdDone)
  1634.         FreeIfObject(fDraw);            // MacApp routine - Free Draw if (not finally displayed
  1635.     inherited::Free();    
  1636. }
  1637.  
  1638.  
  1639. // ------------------------------------------------------------------------
  1640. #if qInspector
  1641. #pragma segment AFields
  1642. pascal void TSketcher::Fields(pascal void (*DoToField)(StringPtr fieldName, Ptr fieldAddr, short 
  1643.     fieldType, void *DoToField_StaticLink), void *DoToField_StaticLink)
  1644. {
  1645.     DoToField("\pTSketcher", NULL, bClass, DoToField_StaticLink);
  1646.     DoToField("\pfDraw", (Ptr) &fDraw, bObject, DoToField_StaticLink);
  1647.     DoToField("\pfDrawDocument", (Ptr) &fDrawDocument, bObject, DoToField_StaticLink);
  1648.     DoToField("\pfDrawView", (Ptr) &fDrawView, bObject, DoToField_StaticLink);
  1649.     inherited::Fields(DoToField, DoToField_StaticLink);
  1650. };
  1651. #endif
  1652.  
  1653. // =========================== Command Object ================================
  1654. #pragma segment ASelCommand
  1655. pascal void TDeleteCmd::IDeleteCmd(TDrawView *itsView, TDrawDocument *itsDocument)
  1656. {
  1657.     fDrawView = itsView;
  1658.     fDrawDocument = itsDocument;
  1659.     fDeletedDraw = itsDocument->FirstDraw();
  1660.     TScroller* aScroller = itsView->GetScroller(true);
  1661.     this->ICommand(cDeleteFirstMsg,                 // itsCmdNumber
  1662.                         itsDocument,                    // itsDocument
  1663.                         itsView,                         // itsView
  1664.                         aScroller);                        // itsScroller
  1665. }
  1666.  
  1667. // ------------------------------------------------------------------------------
  1668. #pragma segment ADoCommand
  1669. pascal void TDeleteCmd::DoIt()
  1670. {
  1671.     
  1672.     fDrawDocument->DeleteDraw(fDeletedDraw);
  1673.     Rect DrawRect = fDeletedDraw->ReturnFrame();
  1674.     InsetRect(&DrawRect, -4, -4);
  1675.     fDrawView->InvalidRect(&DrawRect);                // force update
  1676. }
  1677.  
  1678. // ------------------------------------------------------------------------------
  1679. #pragma segment ADoCommand
  1680. pascal void TDeleteCmd::RedoIt()
  1681. {
  1682.     this->DoIt();
  1683. }
  1684.  
  1685. // ------------------------------------------------------------------------------
  1686. #pragma segment ADoCommand
  1687. pascal void TDeleteCmd::UndoIt()
  1688. {
  1689.     fDrawDocument->AddDrawFirst(fDeletedDraw);
  1690.     Rect DrawRect = fDeletedDraw->ReturnFrame();
  1691.     fDrawView->InvalidRect(&DrawRect);        // force update
  1692. }
  1693.  
  1694. // ------------------------------------------------------------------------------
  1695. #pragma segment AClose
  1696. pascal void TDeleteCmd::Free()
  1697.     
  1698. {
  1699.     if (fCmdDone)
  1700.         FreeIfObject(fDeletedDraw);        // MacApp routine - Free Draw if not finally displayed
  1701.     inherited::Free();    
  1702. };
  1703.  
  1704.  
  1705. // ------------------------------------------------------------------------
  1706. #if qInspector
  1707. #pragma segment AFields
  1708. pascal void TDeleteCmd::Fields(pascal void (*DoToField)(StringPtr fieldName, Ptr fieldAddr, short 
  1709.     fieldType, void *DoToField_StaticLink), void *DoToField_StaticLink)
  1710. {
  1711.     DoToField("\pTDeleteCmd", NULL, bClass, DoToField_StaticLink);
  1712.     DoToField("\pfDeletedDraw", (Ptr) &fDeletedDraw, bObject, DoToField_StaticLink);
  1713.     DoToField("\pfDrawDocument", (Ptr) &fDrawDocument, bObject, DoToField_StaticLink);
  1714.     DoToField("\pfDrawView", (Ptr) &fDrawView, bObject, DoToField_StaticLink);
  1715.     inherited::Fields(DoToField, DoToField_StaticLink);
  1716. };
  1717. #endif
  1718.  
  1719. // ==============================================================================
  1720. #pragma segment ARes
  1721. pascal void TShapeGridView::IRes(TDocument *itsDocument, TView *itsSuperView, Ptr *itsParams)
  1722. {
  1723.     GridCell        aCell;
  1724.     
  1725.     inherited::IRes(itsDocument, itsSuperView, itsParams);
  1726.     aCell.h = 1;
  1727.     aCell.v = 1;
  1728.     this->SelectCell(aCell, false, true, true);
  1729. }
  1730.  
  1731. // ------------------------------------------------------------------------------
  1732. #pragma segment ADraw
  1733. pascal void TShapeGridView::DrawCell(GridCell aCell, Rect *aQDRect)
  1734. {
  1735.     Handle aShapeIcon = GetIcon(2000+aCell.h-1);
  1736.     FailNILResource(aShapeIcon);
  1737.     PlotIcon(aQDRect, aShapeIcon);
  1738. }
  1739.  
  1740. // ------------------------------------------------------------------------------
  1741. #pragma segment ASelCommand
  1742. pascal OSType TShapeGridView::GetShapeType()
  1743. {
  1744.     switch (this->FirstSelectedCell().h) {
  1745.         case 1:
  1746.             return typeGraphicLine;
  1747.         case 2:
  1748.             return typeRectangle;
  1749.         case 3:
  1750.             return typeOval;
  1751.         case 4:
  1752.             return typeRoundedRectangle;
  1753.         case 5:
  1754.             return 'arc ';
  1755.         case 6:
  1756.             return typePICT;
  1757.         default:
  1758.             return 'dflt';
  1759.     }
  1760.  
  1761. }
  1762.  
  1763. // ==============================================================================
  1764. #pragma segment ARes
  1765. pascal void TPatternView::IRes(TDocument *itsDocument, TView *itsSuperView, Ptr *itsParams)
  1766. {
  1767.     GridCell        aCell;
  1768.     
  1769.     inherited::IRes(itsDocument, itsSuperView, itsParams);
  1770.     aCell.h = 1;
  1771.     aCell.v = 1;
  1772.     this->SelectCell(aCell, false, true, true);
  1773. }
  1774.  
  1775. // ------------------------------------------------------------------------------
  1776. #pragma segment ADraw
  1777. pascal void TPatternView::DrawCell(GridCell aCell, Rect *aQDRect)
  1778. {
  1779.     Pattern    aPat;
  1780.     
  1781.     GetIndPattern(aPat, 128, (aCell.h - 1) + (aCell.v - 1) * 10 + 1);
  1782.     PenSize(3,3);
  1783.     PenPat((ConstPatternParam)qd.white);
  1784.     FillRect(aQDRect, (ConstPatternParam)aPat);
  1785.     PenNormal();
  1786.     FrameRect(aQDRect);
  1787. }
  1788.  
  1789. // ------------------------------------------------------------------------------
  1790. #pragma segment ADraw
  1791. pascal void TPatternView::GetPattern(Pattern itsPattern)
  1792. {
  1793.     GridCell        aPat;
  1794.     short            aPatNum;
  1795.     
  1796.     aPat = this->FirstSelectedCell();
  1797.     if (aPat.h != 0)
  1798.         aPatNum = (aPat.h-1)+(aPat.v-1)*10+1;
  1799.     else
  1800.         aPatNum = 0;
  1801.     GetIndPattern((Pattern)itsPattern, 128, aPatNum);
  1802. }
  1803.  
  1804. // ------------------------------------------------------------------------------
  1805. #pragma segment ADoCommand
  1806. pascal void TSetSelfCmd::DoIt()
  1807. {
  1808.     gIsCurrentTargetSelf = true;
  1809.     
  1810.     AEDuplicateDesc(&gSELF, &gCurrentTarget);
  1811. }
  1812.  
  1813. // ------------------------------------------------------------------------------
  1814. #pragma segment ADoCommand
  1815. pascal void TSetTargetAddress::DoIt()
  1816. {
  1817.     TargetID                    aTargetID;
  1818.     ProcessSerialNumber    aTargetPSN;
  1819.     PortInfoRec                aPortInfo;
  1820.     OSErr                        PPCresult;
  1821.     OSErr                        PSNError;
  1822.     
  1823.     PPCresult = PPCBrowser("\pLink to…","\p",false,&aTargetID.location,&aPortInfo,nil,"\p");
  1824.     if (PPCresult == noErr) {
  1825.         gIsCurrentTargetSelf = false;
  1826.         PSNError = GetProcessSerialNumberFromPortName(&aPortInfo.name, &aTargetPSN);
  1827.         if (PSNError == noErr) {
  1828.             gIsCurrentTargetLocal = true;
  1829.             FailOSErr(AECreateDesc(typeProcessSerialNumber,(Ptr)&aTargetPSN,sizeof(ProcessSerialNumber),&gCurrentTarget));
  1830.         }
  1831.         else {
  1832.             gIsCurrentTargetLocal = false;
  1833.             aTargetID.name = aPortInfo.name;
  1834.             FailOSErr(AECreateDesc(typeTargetID, (Ptr)&aTargetID, sizeof(TargetID), &gCurrentTarget));
  1835.         }
  1836.     }
  1837.     else {        // if PPCresult == userCanceledErr
  1838.         gIsCurrentTargetSelf = true;
  1839.         FailOSErr(AEDuplicateDesc(&gSELF, &gCurrentTarget));
  1840.     }
  1841. }
  1842.  
  1843. // ------------------------------------------------------------------------------
  1844. #pragma segment ADoCommand
  1845. pascal void TLaunchApplication::DoIt()
  1846. {
  1847.     StandardFileReply        aSFR;
  1848.     SFTypeList                aSFType;
  1849.     LaunchParamBlockRec    aLaunchAppl;
  1850. //    ProcessInfoRec            aLaunchPSNInfo;
  1851. //    OSErr                        aLaunchErr;
  1852.     
  1853.     aSFType[0] = 'APPL';
  1854.     StandardGetFile((FileFilterProcPtr)nil, 1, aSFType, &aSFR);
  1855.     if (aSFR.sfGood) {
  1856.         aLaunchAppl.launchBlockID            = extendedBlock;
  1857.         aLaunchAppl.launchEPBLength        = extendedBlock;
  1858.         aLaunchAppl.launchFileFlags        = 0;
  1859.         aLaunchAppl.launchControlFlags    = launchContinue + launchNoFileFlags;
  1860.         *aLaunchAppl.launchAppSpec            = aSFR.sfFile;
  1861.         aLaunchAppl.launchAppParameters    = (AppParametersPtr)nil;
  1862.         FailOSErr(LaunchApplication(&aLaunchAppl));
  1863. //        if (aLaunchErr == noErr) {
  1864. //--------- Can lauched application handle AppleEvent?
  1865. //            FailOSErr(GetProcessInformation(&aLaunchAppl.launchProcessSN, &aLaunchPSNInfo) != noErr);
  1866. //            if ((aLaunchPSNInfo.processMode && modeHighLevelEventAware) != 0) {
  1867. //                gIsCurrentTargetSelf = false;
  1868. //                FailOSErr(AECreateDesc(typeProcessSerialNumber,(Ptr)&aLaunchAppl.launchProcessSN,sizeof(ProcessSerialNumber),&gCurrentTarget));
  1869. //                EnableCheck(cSetSelf, true, false);
  1870. //                EnableCheck(cSetTargetAddress, true, true);
  1871. //            }
  1872. //        }
  1873. //        else {
  1874. //            SysBeep(1);
  1875. //        }
  1876.     }
  1877. }
  1878.  
  1879. // ------------------------------------------------------------------------------
  1880. #pragma segment ADoCommand
  1881. pascal void TAEOldDocCommand::IAEOldDocCommand(CmdNumber itsCmdNumber)
  1882. {
  1883.     this->IOldDocCommand(itsCmdNumber);
  1884. }
  1885.  
  1886. // ------------------------------------------------------------------------------
  1887. #pragma segment ADoCommand
  1888. pascal void TAEOldDocCommand::DoIt()
  1889. {
  1890.     StandardFileReply    aSFR;
  1891.     AppleEvent            anAppleEvent;
  1892.     AEDescList            aDocList;
  1893.     AEDesc                aDocDesc;
  1894.     AppleEvent            reply;
  1895.  
  1896.     StandardGetFile((FileFilterProcPtr)nil, -1, (SFTypeList)nil, &aSFR);
  1897.     if (aSFR.sfGood) {
  1898.         FailOSErr(AECreateAppleEvent(kCoreEventClass, kAEOpenDocuments, &gCurrentTarget, kAutoGenerateReturnID, kAnyTransactionID, &anAppleEvent));
  1899.         FailOSErr(AECreateDesc(typeFSS, (Ptr)&aSFR.sfFile, sizeof(FSSpec), &aDocDesc));
  1900.         FailOSErr(AECreateList((Ptr)nil, 0, false, &aDocList));
  1901.         FailOSErr(AEPutDesc(&aDocList, 1, &aDocDesc));
  1902.         FailOSErr(AEPutParamDesc(&anAppleEvent, keyDirectObject, &aDocList));
  1903.         FailOSErr(AESend(&anAppleEvent, &reply, kAENoReply, kAENormalPriority, 0, (IdleProcPtr)nil, (EventFilterProcPtr)nil));
  1904.     }
  1905. }
  1906.  
  1907. // ------------------------------------------------------------------------------
  1908. #pragma segment ADoCommand
  1909. pascal void TAENewDocCommand::IAENewDocCommand(CmdNumber itsCmdNumber)
  1910. {
  1911.     this->INewDocCommand(itsCmdNumber);
  1912. }
  1913.  
  1914. // ------------------------------------------------------------------------------
  1915. #pragma segment ADoCommand
  1916. pascal void TAENewDocCommand::DoIt()
  1917. {
  1918.     AppleEvent            anAppleEvent;
  1919.     AppleEvent            reply;
  1920.  
  1921.     FailOSErr(AECreateAppleEvent(kCoreEventClass, kAEOpenApplication, &gCurrentTarget, kAutoGenerateReturnID, kAnyTransactionID, &anAppleEvent));
  1922.     FailOSErr(AESend(&anAppleEvent, &reply, kAENoReply, kAENormalPriority, 0, (IdleProcPtr)nil, (EventFilterProcPtr)nil));
  1923. }
  1924.  
  1925. // ------------------------------------------------------------------------------
  1926. #pragma segment ADoCommand
  1927. pascal void TAECloseWindowCommand::IAECloseWindowCommand(CmdNumber itsCmdNumber)
  1928. {
  1929.     this->ICloseWindowCommand(itsCmdNumber, gDrawApplication->GetFrontWindow());
  1930. }
  1931.  
  1932. // ------------------------------------------------------------------------------
  1933. #pragma segment ADoCommand
  1934. pascal void TAECloseWindowCommand::DoIt()
  1935. {
  1936.     AppleEvent            anAppleEvent;
  1937.     AppleEvent            reply;
  1938.     
  1939.     Str255                docName;
  1940.     Str255                targetDocName;
  1941.     AEDesc                dDoc;
  1942.     AEDesc                dNull;
  1943.     AEDesc                dDocName;
  1944.     
  1945.     TWindow* aWindow = NewTemplateWindow(1001, (TDocument*)nil);
  1946.     TDialogView* aDialogView = (TDialogView*)aWindow->FindSubView('dlog');
  1947.     gDrawApplication->GetFrontWindow()->GetTitle((StringPtr)&docName);
  1948.     TTEView* aTEView = (TTEView*)aWindow->FindSubView('edtx');
  1949.     aWindow->Open();
  1950. //    aTEView->SetText((StringPtr)&docName);
  1951. //    aDialogView->DrawContents();
  1952.     while (aDialogView->PoseModally() != 'okok');
  1953.     GetStr255FromTextHandle(aTEView->fText, (StringPtr)&targetDocName);
  1954.     aWindow->Close();
  1955.     
  1956.     FailOSErr(AECreateDesc(typeNull, nil, 0, &dNull));
  1957.     FailOSErr(AECreateDesc(typeChar, (Ptr)&targetDocName + 1, targetDocName[0], &dDocName));
  1958.     FailOSErr(CreateObjSpecifier(cDocument, &dNull, formName, &dDocName, true, &dDoc));
  1959.     FailOSErr(AECreateAppleEvent(kAECoreSuite, kAEClose, &gCurrentTarget, kAutoGenerateReturnID, kAnyTransactionID, &anAppleEvent));
  1960.     FailOSErr(AEPutParamDesc(&anAppleEvent, keyDirectObject, &dDoc));
  1961.     FailOSErr(AESend(&anAppleEvent, &reply, kAENoReply, kAENormalPriority, 0, (IdleProcPtr)nil, (EventFilterProcPtr)nil));
  1962. }
  1963.  
  1964. // ------------------------------------------------------------------------------
  1965. #pragma segment ADoCommand
  1966. pascal void TAEAboutAppCommand::DoIt()
  1967. {
  1968.     AppleEvent            anAppleEvent;
  1969.     AppleEvent            reply;
  1970.     
  1971.  
  1972.     FailOSErr(AECreateAppleEvent(kCoreEventClass, kAEAbout, &gCurrentTarget, kAutoGenerateReturnID, kAnyTransactionID, &anAppleEvent));
  1973.     FailOSErr(AESend(&anAppleEvent, &reply, kAEQueueReply + kAEAlwaysInteract + kAECanSwitchLayer, kAENormalPriority, kAEDefaultTimeout, (IdleProcPtr)nil, (EventFilterProcPtr)nil));
  1974. }
  1975.  
  1976.